/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mx.unam.fciencias.ActividadesCulturales.services.DAO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * Acceso a datos generico.
 * @author lumartin
 */
public class GenericDAO extends HibernateDaoSupport {

    /** Log de la clase. */
    private static final Log log = LogFactory.getLog(GenericDAO.class);

    /**
     * Guarda o actualiza una entidad generica.
     * @param entidad a guardar.
     * @return true si se guardo correctamente false si no.
     */
    protected boolean guardar(Object entidad) {
        try {
            getSesionDAO().saveOrUpdate(entidad);
            return true;
        } catch(HibernateException ex) {
            log.error("Error al guardar en la base de datos", ex);
            return false;
        }
    }

    /**
     * Elimina una entidad generica.
     * @param entidad a eliminar.
     * @return true si se guardo correctamente false si no.
     */
    protected boolean eliminar(Object entidad) {
        try {
            getSesionDAO().delete(entidad);
            return true;
        } catch (HibernateException ex) {
            log.error("Error al eliminar en la base de datos", ex);
            return false;
        }
    }

    /**
     * Obtiene una entidad generica a partir de su identificador.
     * @param entidad a obtener.
     * @param id identificador de la entidad.
     * @return la entidad.
     */
    protected Object getById(Class entidad, long id) {
        Criteria crit = getSesionDAO().createCriteria(entidad);
        crit.add(Restrictions.eq("id", id));
        return (Object) crit.uniqueResult();
    }

    /**
     * Obtiene la sesión actual.
     * @return la sesión
     */
    protected Session getSesionDAO() {
        return getHibernateTemplate().getSessionFactory().getCurrentSession();
    }
}
